// bzoj1132
// 题意：给定平面上n(<=3000)个整点，求所有以这n个点为顶点的三角形面积和。
//
// 题解：首先枚举一个点，然后枚举其他点，得到以这个点为起点的所有向量，
//       三角形的面积就是两个向量的叉积的一半的绝对值。现在就是有n个向
//       量，要求俩俩叉积的和。考虑vi=(xi, yi), vj=(xj, yj),
//        vi×vj=xiyj - xjyi。
//       如果你固定了vi，然后vj从i+1到n就可以用前缀和O(n)求出这个式子。
//       但是直接这样也不对，因为叉积是有方向的，如果你顺序不对，一下正
//       一下负的就得不到正确结果，所以我们可以先按照极角序把这n个向量
//       排个序，使其都是顺时针或者逆时针。
//
//       不过光这样还是不对，因为如果两个向量之间是钝角，和锐角，那么按照
//       同一个方向，这两个叉积肯定一正一负，还是得不到正确结果。
//
//       所以我们要想办法消除钝角。我们可以把一开始n个点按照水平序排序，
//       然后从第i个点开始只算以i为起点，i+1～n这些点为终点的向量，这样
//       就不会有钝角了。
//
// run: $exec < bfdiff.in
#include <iostream>
#include <algorithm>
#include <vector>

struct coord { long long x, y; };

bool operator<(coord const & a, coord const & b)
{
	return a.x * b.y < a.y * b.x;
}

int const maxn = 3007;
std::vector<coord> pos;
int n;
long long sumx[maxn], sumy[maxn];

long long calc(std::vector<coord> & v)
{
	std::sort(v.begin(), v.end());
	long long sumx = 0, sumy = 0;
	int len = v.size();
	for (int i = 0; i < len; i++) { sumx += v[i].x; sumy += v[i].y; }
	long long ret = 0;
	for (int i = 1; i <= len; i++) {
		sumx -= v[i - 1].x; sumy -= v[i - 1].y;
		ret += v[i - 1].x * sumy - v[i - 1].y * sumx;
	}
	return ret;
}

bool level_cmp(coord const & a, coord const & b)
{
	return a.x < b.x || (a.x == b.x && a.y < b.y);
}

int main()
{
	std::cin >> n;
	pos.resize(n);
	for (int i = 0; i < n; i++) std::cin >> pos[i].x >> pos[i].y;
	std::sort(pos.begin(), pos.end(), level_cmp);
	for (auto i : pos) std::cout << i.x << ' ' << i.y << '\n';

	long long ans = 0;
	for (int i = 0; i < n; i++) {
		std::vector<coord> v;
		for (int j = i + 1; j < n; j++) {
			if (i == j) continue;
			coord tmp;
			tmp.x = pos[j].x - pos[i].x;
			tmp.y = pos[j].y - pos[i].y;
			v.push_back(tmp);
		}
		ans += calc(v);
		/*
		std::cout << pos[i].x << ' ' << pos[i].y << "  " << calc(v) << '\n';
		for (auto i : v) std::cout << i.x << ' ' << i.y << " : ";
		std::cout << '\n';
		*/
	}
	if (ans < 0) ans = -ans;
	std::cout << ans / 2 << '.' << ((ans & 1) ? "5\n" : "0\n");
}

